package aiP.A3.Client.GUI.KundenService;

import aiP.A3.AuftragKomponente.DataAccessLayer.Entity.Angebot;
import aiP.A3.AuftragKomponente.DataAccessLayer.Entity.Auftrag;
import aiP.A3.BuchhaltungKomponente.DataAccessLayer.Entity.Kunde;
import aiP.A3.BuchhaltungKomponente.DataAccessLayer.Entity.Rechnung;
import aiP.A3.BuchhaltungKomponente.DataAccessLayer.Entity.Zahlungseingang;
import aiP.A3.Client.Dispatcher.IDispatcher;
import aiP.A3.FertigungKomponente.DataAccessLayer.Entity.Bauteil;
import aiP.A3.Image.Imageloader;
import aiP.A3.UPPSAdapter.ITransport_Adapter;
import aiP.A3.UPPSAdapter.TransportAdapter;
import aiP.A3.VersandKomponente.DataAccessLayer.DTO.TransportauftragDTO;
import aiP.A3.VersandKomponente.DataAccessLayer.Entity.Transportauftrag;

import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.plaf.BorderUIResource;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.math.BigDecimal;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * User: mizus
 * Date: 04.05.14
 * Time: 15:48
 * To change this template use File | Settings | File Templates.
 */


public class GUI_Main extends JFrame {

    private Map<String, Kunde> map_Kunde;
    private Map<String, Bauteil> map_Bauteil;
    private Map<Integer, Bauteil> map_Bauteil_id;
    private IDispatcher dispatch;


    public GUI_Main() throws RemoteException, NotBoundException {

        Registry registry = LocateRegistry.getRegistry(1173);
        dispatch = (IDispatcher)registry.lookup("MPS");


        map_Bauteil = dispatch.getBauteilMap();
        map_Kunde = dispatch.getKundenMap();
        map_Bauteil_id = dispatch.getBautei_Id();

        init();
    }

    /**
     *  standard Aufbau der GUI
     */

    private void init(){
        action();
        this.setTitle("CustomerView ... AMS");

        menu_angebot.add(item_angebot);
        menu_angebot.add(new JSeparator());
        menu_angebot.add(item_edit);
        menu_angebot.add(item_del);
        menu_angebot.add(new JSeparator());
        menu_angebot.add(item_view);

        menu_auftrag.add(item_auftrag);
        menu_auftrag.add(new JSeparator());

        menu_start.add(item_exit);


        menu_transport.add(item_trans_new);
        menu_transport.add(new JSeparator());
        menu_transport.add(item_trans_view);
        menu_transport.add(item_trans_storno);

        menu_finanz.add(item_finanz_check);

        menuBar.add(menu_start);
        menuBar.add(menu_angebot) ;
        menuBar.add(menu_auftrag);
        menuBar.add(menu_fertigung);
        menuBar.add(new JSeparator());
        menuBar.add(menu_transport);
        menuBar.add(menu_finanz);

        this.setJMenuBar(menuBar);

        this.setSize(550,550);
        this.setVisible(true);
    }

    /**
     *
     * Zentrale methode welche die ActionEvents verwaltet.
     *
     */

    private void action(){
        item_exit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        item_finanz_check.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    view_newFinanz();

                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (InterruptedException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (IOException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        btn_finanz_cnl.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_cancelBtn();
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        btn_finanz_okay.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_okay();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (IOException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        item_angebot.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    clearAll();
                    view_newAngebot();
                } catch (NotBoundException e1){
                    e1.printStackTrace();
                } catch (RemoteException e2) {
                    e2.printStackTrace();
                }
            }
        });

        btn_trans_cnl.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_cancelBtn(); //To change body of implemented methods use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        item_auftrag.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                view_newAuftrag();
            }
        });

        btn_okay_bauteil.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_okay();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (IOException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        item_trans_new.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    view_newTransport();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        btn_save_auftrag.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_okay();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (IOException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        btn_cancel_bauteil.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    action_cancelBtn();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        btn_cancel_auftrag.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
            try{
                action_cancelBtn();
            } catch (RemoteException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (NotBoundException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            }
        });

//        viewList_finanz_rechnung.addListSelectionListener(new ListSelectionListener() {
//            @Override
//            public void valueChanged(ListSelectionEvent e) {
//                action_finanz_list(e);
//            }
//
//
//        });

        btn_addProdukt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                action_addBauteil();
            }
        });

        combo_baustein.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
               action_combo_baustein(e);
            }
        });

        combo_auftrag_kundenname.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    actionComboAuftragKunde();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        combo_trans_auftrag.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_trans_combo_auftrag();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        comboBox_auftrag_Angebot.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionViewDetails();
            }
        });

        btn_auftrag_cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    action_cancelBtn();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        btn_auftrag_save.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_okay();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (IOException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

        btn_trans_okay.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    action_okay();
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (IOException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });

    }

   void action_finanz_list(ListSelectionEvent event) throws RemoteException, NotBoundException {
       String tmpLbl  = (String)viewList_finanz_rechnung.getSelectedValue();

       int rechnungsNr = Integer.valueOf(tmpLbl).intValue();
       for(Rechnung elem: col_rechnung){
           if (elem.getRechnungsnr() == rechnungsNr){
               String tDate = "" + elem.getRechnungsdatum();

               lbl_finanz_rechnung_date_view.setText(""+ tDate.substring(0,10));
               lbl_finanz_rechnungNr_view.setText("" + elem.getRechnungsnr());

                //ToDo Nachaktuallierung des DB- Schema
                lbl_finanz_rechnung_auftragsNr_view.setText(""+ elem.getAuftragsnr());
                lbl_finanz_rechnung_betrag_view.setText(""+ elem.getBetrag());




                double bereitsGezahhlt = 0;
                Collection<Zahlungseingang> col_zahlungseingang = dispatch.getAllZahlungseingaenge();
                for (Zahlungseingang tZahlungseingang: col_zahlungseingang){
                    if (tZahlungseingang.getRechnungsnr() == rechnungsNr){
                        bereitsGezahhlt += tZahlungseingang.getBetrag();
                    }
                }
               lbl_finanz_rechnung_pay_view.setText(""+bereitsGezahhlt);
               double offnerBetrag = elem.getBetrag() - bereitsGezahhlt;
               lbl_finanz_rechnung_openPay_view.setText("" +offnerBetrag);

               if (offnerBetrag < 1)  {
                   lbl_finanz_rechnung_ampel.setIcon(Imageloader.getInstance().loadImage(Imageloader.GREEN));

               }else
                   lbl_finanz_rechnung_ampel.setIcon(Imageloader.getInstance().loadImage(Imageloader.RED));
           }
       }
       this.validate();
       this.repaint();
   }



    void action_trans_combo_auftrag() throws RemoteException, NotBoundException {
        area_trans_details.setText("");
        double gesamtPreis = 0;
        if(combo_trans_auftrag.getSelectedIndex() > 0) {
            Collection<Angebot> col =  dispatch.getAllAngebote();
            for (Angebot elem : col){
                Auftrag tAuftrag = map_auftrag.get(Integer.valueOf(""+combo_trans_auftrag.getSelectedItem()).intValue());
                if (tAuftrag.getAngebotsnr() == elem.getAngebotsnr()){
                    area_trans_details.append(""+map_Bauteil_id.get(elem.getBauteilNr()) + "\n\r");
                    area_trans_details.append("===============//===============\n\r");
                    gesamtPreis += (map_Bauteil_id.get(elem.getBauteilNr()).getPreis()).doubleValue();
                }
            }
            lbl_trans_preis_view.setText("" + gesamtPreis);
        }
    }



    void trans_action_ok() throws IOException, NotBoundException {
        if (combo_trans_auftrag.getSelectedIndex() > 0){
            Transportauftrag tTransportauftrag = new Transportauftrag();
            tTransportauftrag.setAuftragsnr(Integer.valueOf("" + combo_trans_auftrag.getSelectedItem()).intValue());
            tTransportauftrag.setAusgangsdatum(new Date());
            tTransportauftrag.setTransportauftragsnr(tTransportauftrag.getAuftragsnr());

            if (dispatch.postToVersanddienstleister(tTransportauftrag)){
                JOptionPane.showMessageDialog(this, "Das Versandunternehmen hat den erhalt es Auftrags bestätigt", "Geschafft...", JOptionPane.INFORMATION_MESSAGE);
                dispatch.saveTransport(tTransportauftrag);
            }else
                JOptionPane.showMessageDialog(this, "Bei der Übermittlung ist leider ein Fehler aufgetretten,\nbitte wende sich sich an die IT", "Fataler Fehler bei der Übermittlung", JOptionPane.ERROR_MESSAGE);

        }else
            JOptionPane.showMessageDialog(this, "Es muss ein Auftrag ausgewählt werden", "Fehler", JOptionPane.ERROR_MESSAGE);
    }

    void actionViewDetails() {

        if(comboBox_auftrag_Angebot.getItemCount() != 0 && comboBox_auftrag_Angebot.getSelectedIndex() != 0){
            int  id = Integer.valueOf((String)comboBox_auftrag_Angebot.getSelectedItem()).intValue();
            Set<Angebot> tmpSet = angebotsMap.get(id);
            double gesamtpreis = 0;
            for (Angebot elem: tmpSet){
                Bauteil bauteil = map_Bauteil_id.get(elem.getBauteilNr());
                txtArea_warenkorb_auftrag.append(bauteil.toString() + "\r\n");
                gesamtpreis += Double.valueOf(""+bauteil.getPreis()).doubleValue();
            }
            lbl_auftrag_view_gesamt_preis.setText(""+gesamtpreis);
        }
    }

    void actionComboAuftragKunde() throws RemoteException, NotBoundException {
        if(combo_auftrag_kundenname.getSelectedIndex() != 0){
            Kunde tmp= map_Kunde.get(combo_auftrag_kundenname.getSelectedItem());
            lbl_auftrag_view_kunde_nr.setText(""+tmp.getKundeId());
            lbl_auftrag_view_kundenname.setText(tmp.getName());
            angebotsMap.putAll(dispatch.getAngebotMap(tmp));
            comboBox_auftrag_Angebot.removeAllItems();
            txtArea_warenkorb_auftrag.setText("");
            fillComboAngebot(comboBox_auftrag_Angebot, angebotsMap, tmp.getKundeId());
        }
    }

    private void fillComboAngebot(JComboBox aCombo, Map<Integer, Set<Angebot>> angebotsMap, int KundenId) {
        aCombo.addItem("");
        for(Integer i: angebotsMap.keySet()){
            boolean check = angebotsMap.get(i).iterator().next().getKundenNr() == KundenId;
            if (check){
                aCombo.addItem("" + i);
            }

        }
    }

    void action_combo_baustein(ActionEvent e){
        Bauteil baustein = map_Bauteil.get(""+combo_baustein.getSelectedItem());

        lbl_bauteil_view_gewicht.setText(""+baustein.getGewicht());
        lbl_bauteil_view_preis.setText(""+baustein.getPreis());
        lbl_bauteil_view_name.setText(baustein.getName());
        lbl_bauteil_view_id.setText(""+baustein.getBauteilId());

    }

    void view_newAngebot() throws NotBoundException, RemoteException{

        fillComboBauteil(map_Bauteil, combo_baustein);
        fillComboKunde(map_Kunde, combo_kundenname);

        this.getContentPane().removeAll();
        komponenten_ID = ID_ADD_Angebot;

        pnl_angebot.setLayout(null);
        txtarea_warenkorb.setEditable(false);
        lbl_name.setBounds(new Rectangle(10,10,100,21));
        lbl_produkt.setBounds(new Rectangle(10,50,100, 21));
        lbl_preis_gesamt.setBounds(new Rectangle(10,90, 100,21));
        lbl_warenkorb.setBounds(new Rectangle(10,130,100,21));

        combo_kundenname.setBounds(new Rectangle(120, 10, 100,21));
        btn_addProdukt.setBounds(new Rectangle(120, 50, 50, 21));
        lbl_auftrag_view_gesamt_preis.setBounds(new Rectangle(120, 90,80,21 ));
        lbl_euro_view_angebot.setBounds(new Rectangle(200,90,30,21));
        txtarea_warenkorb.setBounds(new Rectangle(120, 130, 350, 200));

        btn_save_auftrag.setBounds(new Rectangle(160, 350, 50, 21));
        btn_cancel_auftrag.setBounds(new Rectangle(220, 350, 80, 21));

        pnl_angebot.add(lbl_name, null);
        pnl_angebot.add(lbl_preis_gesamt, null);
        pnl_angebot.add(lbl_produkt, null);
        pnl_angebot.add(lbl_warenkorb,null);
        pnl_angebot.add(combo_kundenname, null);
        pnl_angebot.add(btn_addProdukt, null);
        pnl_angebot.add(lbl_auftrag_view_gesamt_preis, null);
        pnl_angebot.add(txtarea_warenkorb, null);
        pnl_angebot.add(btn_cancel_auftrag,null);
        pnl_angebot.add(btn_save_auftrag,null);
        pnl_angebot.add(lbl_euro_view_angebot, null);

        this.getContentPane().add(pnl_angebot, BorderLayout.CENTER);
        this.validate();
        this.repaint();
    }

    private void view_newAuftrag(){
        try {
            map_Bauteil_id = dispatch.getBautei_Id();
        } catch (RemoteException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (NotBoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        fillComboKunde(map_Kunde, combo_auftrag_kundenname);

        this.getContentPane().removeAll();
        komponenten_ID = ID_ADD_Auftrag;
        pnl_auftrag.setLayout(null);

        lbl_auftrag_kunde.setBounds(new Rectangle(10,10,120,21));
        combo_auftrag_kundenname.setBounds(new Rectangle(130,10,100,28));

        lbl_auftrag_kundenname.setBounds(new Rectangle(10, 50, 120, 21));
        lbl_auftrag_view_kundenname.setBounds(new Rectangle(130,50,120,21));

        lbl_auftrag_kunde_nr.setBounds(new Rectangle(260, 50, 80, 21));
        lbl_auftrag_view_kunde_nr.setBounds(new Rectangle( 340, 50, 50, 21));

        lbl_auftrag_angebot.setBounds(new Rectangle(10, 90, 80, 21));
        comboBox_auftrag_Angebot.setBounds(new Rectangle(120,90, 120, 28));

        lbl_auftrag_gesamtPreis.setBounds(new Rectangle(10, 130, 100, 21));
        lbl_auftrag_view_gesamt_preis.setBounds(new Rectangle(120, 130, 80, 21));
        lbl_auftrag_viewEuro.setBounds(new Rectangle(200,130, 50,21));

        lbl_auftrag_details.setBounds(new Rectangle(10, 170, 80, 21));
        scrollPane_auftrag_area.setBounds(new Rectangle(100, 170, 350, 170));

        scrollPane_auftrag_area.getViewport().setView(txtArea_warenkorb_auftrag);

        btn_auftrag_save.setBounds(new Rectangle(100,350, 200, 21));
        btn_auftrag_cancel.setBounds(new Rectangle(310, 350, 100,21));


        pnl_auftrag.add(lbl_auftrag_kunde, null);
        pnl_auftrag.add(combo_auftrag_kundenname, null);

        pnl_auftrag.add(lbl_auftrag_kundenname,null);
        pnl_auftrag.add(lbl_auftrag_view_kundenname, null);

        pnl_auftrag.add(lbl_auftrag_view_kunde_nr, null);
        pnl_auftrag.add(lbl_auftrag_kunde_nr, null);

        pnl_auftrag.add(lbl_auftrag_angebot, null);
        pnl_auftrag.add(comboBox_auftrag_Angebot, null);
        pnl_auftrag.add(lbl_auftrag_gesamtPreis, null);
        pnl_auftrag.add(lbl_auftrag_view_gesamt_preis, null);
        pnl_auftrag.add(lbl_auftrag_viewEuro, null);
        pnl_auftrag.add(lbl_auftrag_details, null);
        pnl_auftrag.add(scrollPane_auftrag_area, null);
        pnl_auftrag.add(btn_auftrag_save, null);
        pnl_auftrag.add(btn_auftrag_cancel, null);

        this.getContentPane().add(pnl_auftrag, BorderLayout.CENTER);
        this.validate();
        this.repaint();
    }

    void action_addBauteil(){
        this.getContentPane().remove(pnl_angebot);
        this.validate();
        this.repaint();
        komponenten_ID = ID_bauteil;

        pnl_bauteil.setLayout(null);

        lbl_bauteil_combo.setBounds(new Rectangle(10,10,180,21));
        lbl_arikelnummer.setBounds(new Rectangle(10,50,130, 21));
        lbl_bauteil_name.setBounds(new Rectangle(10, 90,130,21));
        lbl_bauteil_gewicht.setBounds(new Rectangle(10, 130, 130,21));
        lbl_preis_einzel.setBounds(new Rectangle(10, 170,130,21));

        combo_baustein.setBounds(new Rectangle(140,10,100,30));
        lbl_bauteil_view_id.setBounds(new Rectangle(140,50,100,21));
        lbl_bauteil_view_name.setBounds(new Rectangle(140,90,100,21));
        lbl_bauteil_view_gewicht.setBounds(new Rectangle(140,130,80,21));
        lbl_bauteil_view_preis.setBounds(new Rectangle(140, 170, 80, 21));
        lbl_kg_view.setBounds(new Rectangle(220,130,40,21));
        lbl_euro_view.setBounds(new Rectangle(220,170,40,21));

        btn_okay_bauteil.setBounds(new Rectangle(150, 200, 50, 21));
        btn_cancel_bauteil.setBounds(new Rectangle(210,200,80,21));

        btn_okay_bauteil.setText("Add");

        pnl_bauteil.add(lbl_bauteil_name, null);
        pnl_bauteil.add(lbl_bauteil_combo, null);
        pnl_bauteil.add(lbl_preis_einzel,null);
        pnl_bauteil.add(combo_baustein, null);
        pnl_bauteil.add(lbl_bauteil_gewicht, null);
        pnl_bauteil.add(lbl_bauteil_view_name, null);
        pnl_bauteil.add(lbl_bauteil_view_gewicht, null);
        pnl_bauteil.add(lbl_bauteil_view_id, null);
        pnl_bauteil.add(lbl_bauteil_view_preis, null);
        pnl_bauteil.add(lbl_euro_view, null);
        pnl_bauteil.add(lbl_kg_view, null);
        pnl_bauteil.add(lbl_arikelnummer,null);
        pnl_bauteil.add(btn_cancel_bauteil, null);
        pnl_bauteil.add(btn_okay_bauteil,null);


        this.getContentPane().add(pnl_bauteil);
        this.validate();
    }

    void action_cancelBtn()throws NotBoundException, RemoteException{
        switch (komponenten_ID){
            case ID_ADD_Angebot:
                this.getContentPane().remove(pnl_angebot);
                break;
            case ID_bauteil:
                this.getContentPane().remove(pnl_bauteil);
                view_newAngebot();
                break;
            case ID_ADD_Auftrag:
                this.getContentPane().remove(pnl_auftrag);
                break;
            case ID_FINANZ:
                this.getContentPane().remove(pnl_finanz);
                break;
            case ID_TRANSPORT:
                this.getContentPane().remove(pnl_trans);
                break;
        }
        this.validate();
        this.repaint();
    }

    void action_okay() throws IOException, NotBoundException {
        switch (komponenten_ID){
            case ID_ADD_Angebot:
                createAngebot();
                this.getContentPane().remove(pnl_angebot);
                break;
            case ID_EDIT_Angebot:

                this.getContentPane().remove(pnl_angebot);
                break;
            case ID_VIEW_Angebot:

                this.getContentPane().remove(pnl_angebot);
                break;
            case ID_Ferttigung:

                this.getContentPane().remove(pnl_angebot);
                break;
            case ID_bauteil:
                if(combo_baustein.getSelectedIndex() != -1){
                    addBauteil();
                    this.getContentPane().remove(pnl_bauteil);
                    view_newAngebot();
                }else
                    JOptionPane.showMessageDialog(this, "Bitte ein Bauteil auswählen bevor Add", "Fehler", JOptionPane.ERROR_MESSAGE);
                break;
            case ID_ADD_Auftrag:
                this.getContentPane().remove(pnl_auftrag);
                createAuftrag();
                break;
            case ID_FINANZ:


                this.getContentPane().removeAll();
                break;
            case ID_TRANSPORT:
                trans_action_ok();
                this.getContentPane().removeAll();
                break;
        }
        this.validate();
        this.repaint();
    }


    private void addBauteil(){
        txtarea_warenkorb.setText("");
        auftragsVolumen.add(map_Bauteil.get("" + combo_baustein.getSelectedItem()));
        double gesamtPreis = 0;
        for (Bauteil elem : auftragsVolumen){
            txtarea_warenkorb.append(elem.toString() + "\n");
            txtarea_warenkorb.append("============================\n");
            gesamtPreis += Double.valueOf(""+elem.getPreis()).doubleValue();
        }
        gesamtPreis_Angebot = gesamtPreis;
        lbl_auftrag_view_gesamt_preis.setText(createViewPriece(gesamtPreis));
    }


    private void createAuftrag() throws RemoteException, NotBoundException {
        // Auftrag
        Auftrag tAuftrag = new Auftrag();
        tAuftrag.setAngebotsnr(Integer.valueOf(comboBox_auftrag_Angebot.getSelectedItem().toString()).intValue());
        tAuftrag.setAuftragsnr(comboBox_auftrag_Angebot.getItemCount() +1);
        tAuftrag.setIstAbgeschlossen(0);
        tAuftrag.setBeauftragtAm(new Date());
        dispatch.saveAuftrag(tAuftrag);
        //Rechnung
        Rechnung tRechnung = new Rechnung();
        tRechnung.setRechnungsdatum(new Date());
        tRechnung.setRechnungsnr(dispatch.getAllRechnung().size() + 1);
        tRechnung.setIstbezahlt(0);
        tRechnung.setAuftragsnr(tAuftrag.getAuftragsnr());
        tRechnung.setBetrag(Double.valueOf(lbl_auftrag_view_gesamt_preis.getText()).doubleValue());
        dispatch.saveRechnung(tRechnung);
    }

    private void createAngebot() throws RemoteException, NotBoundException {
        Kunde kunde = map_Kunde.get(""+combo_kundenname.getSelectedItem());

        // Aus der Datenbank werden alle Angebotte gezogen für den Kunden & dann die Angebotss Id um einen
        // erhöht
        int angebotCounter = dispatch.getAllAngebote().size();
        Set<Angebot> toSave = new HashSet<Angebot>();
        for (Bauteil elem: auftragsVolumen){
            Angebot tAngebot = new Angebot();
            tAngebot.setId(angebotCounter++);
            tAngebot.setAngebotsnr(dispatch.getAngebotMap(kunde).size() + 1);
            tAngebot.setGesamtpreis(gesamtPreis_Angebot);


            Date now = new Date();
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(now);

            // add 5 days to calendar instance
            calendar.add(Calendar.DAY_OF_MONTH, 14);

            // get the date instance
            Date future = calendar.getTime();


            tAngebot.setGueltigAb(now);
            tAngebot.setGueltigBis(future);
            tAngebot.setKundenNr(kunde.getKundeId());
            tAngebot.setBauteilNr(elem.getBauteilId());

            toSave.add(tAngebot);
        }

        this.getContentPane().removeAll();
        this.validate();
        this.repaint();
        dispatch.saveAngebot(toSave);
    }

    private Bauteil getBauteil(Collection<Bauteil> col, String name){
        Bauteil result = null;
        for (Bauteil elem: col) {
            if (elem.getName().equals(name)) result = elem;
        }
        return result;
    }

    private void fillComboBauteil(Map<String, Bauteil> col, JComboBox comboBox){
        if (comboBox.getItemCount() == 0)
        for (Bauteil elem: col.values()){
            comboBox.addItem(elem.getName());
        }
    }

    private void fillComboKunde(Map<String, Kunde> col, JComboBox comboBox){
        if (comboBox.getItemCount() == 0)
        for (Kunde elem: col.values()){
            comboBox.addItem(elem.getName());
        }
    }

    private void clearAll(){
        txtarea_warenkorb.setText("");
        txtfld_preis.setText("");
        txtfld_preis.setText("");
        auftragsVolumen = new HashSet<Bauteil>();
    }

    private void out(String str){
        System.out.println(str);
    }

    private String createViewPriece(double gesamtPreis){
        String result = "";
        int tmp =  (int)gesamtPreis*100;
        double tmo2= tmp/100;
        result += tmo2;
        return result;
    }

    private Map<Integer, Auftrag> map_auftrag = null;

    private void view_newTransport() throws RemoteException, NotBoundException {

        this.getContentPane().removeAll();
        this.validate();

        komponenten_ID = ID_TRANSPORT;

        map_auftrag = dispatch.getAuftragsMap();

        fillCombo_Auftrag(map_auftrag, combo_trans_auftrag);

        pnl_trans.setLayout(null);

        lbl_trans_auftrag.setBounds(new Rectangle(5, 50, 130, 21 ));
        combo_trans_auftrag.setBounds(new Rectangle(140, 48, 100,27));

        lbl_trans_preis.setBounds(new Rectangle(5, 90, 130, 21));
        lbl_trans_preis_view.setBounds(new Rectangle(140,90,60,21));
        lbl_trans_euro_view.setBounds(new Rectangle(210,90,30,21));

        lbl_trans_details.setBounds(new Rectangle(5,130, 130, 21));
        scrollPane_trans_details.setBounds(new Rectangle(140, 130, 350,250));

        btn_trans_okay.setBounds(new Rectangle(140, 390, 100, 21));
        btn_trans_cnl.setBounds(new Rectangle(250, 390,100, 21));

        scrollPane_trans_details.setBorder(new EtchedBorder());
        scrollPane_trans_details.getViewport().add(area_trans_details);

        pnl_trans.add(lbl_trans_auftrag, null);
        pnl_trans.add(lbl_trans_details, null);
        pnl_trans.add(combo_trans_auftrag,null);
        pnl_trans.add(lbl_trans_preis, null);
        pnl_trans.add(lbl_trans_preis_view, null);
        pnl_trans.add(lbl_trans_euro_view, null);
        pnl_trans.add(scrollPane_trans_details, null);
        pnl_trans.add(btn_trans_cnl, null);
        pnl_trans.add(btn_trans_okay, null);

        this.getContentPane().add(pnl_trans, BorderLayout.CENTER);
        this.repaint();
        this.validate();

    }

    private Collection<Rechnung> col_rechnung  = null;

    private void view_newFinanz() throws IOException, NotBoundException, InterruptedException {
        //ToDo Methodenaufruf zum PRüfen des Zahlungseingang!!!
        persistZahlungseingaengefromQueue();

       this.getContentPane().removeAll();
       this.validate();
       komponenten_ID = ID_FINANZ;
       pnl_finanz.setLayout(null);
       pnl_finanz_detail.setLayout(null);


       lbl_finanz_rechnung.setBounds(new Rectangle(40,10,80, 21));
       lbl_finanz_rechnung_details.setBounds(new Rectangle(310, 10, 80, 21));

       col_rechnung =  dispatch.getAllRechnung();

       fillRechnungsList(col_rechnung);

        viewList_finanz_rechnung =  new JList(fillRechnungsList(col_rechnung));
        viewList_finanz_rechnung.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        viewList_finanz_rechnung.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                try {
                    action_finanz_list(e);
                } catch (RemoteException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                } catch (NotBoundException e1) {
                    e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }


        });

       pnl_finanz_detail.setBorder(new EtchedBorder());
       pnl_finanz_detail.setBounds(new Rectangle(270,40,250, 400));

       lbl_finanz_rechnungsNr.setBounds(new Rectangle(10,10,130, 21));
       lbl_finanz_rechnungNr_view.setBounds(new Rectangle(150,10,100,21));
       lbl_finanz_rechnungs_date.setBounds(new Rectangle(10,40,130,21));
       lbl_finanz_rechnung_date_view.setBounds(new Rectangle(150,40,100,21));

       lbl_finanz_rechnung_auftragNummer.setBounds(new Rectangle(10,70,130,21));
       lbl_finanz_rechnung_auftragsNr_view.setBounds(new Rectangle(150,70,100,21));

       lbl_finanz_rechnung_betrag.setBounds(new Rectangle(10,100,130,21));
       lbl_finanz_rechnung_betrag_view.setBounds(new Rectangle(150,100,70,21));
       lbl_finanz_rechnung_betrag_euro.setBounds(new Rectangle(225,100,30,21));

       lbl_finanz_rechnung_openPay.setBounds(new Rectangle(10,130, 130, 21));
       lbl_finanz_rechnung_openPay_view.setBounds(new Rectangle(150,130,70, 21));
       lbl_finanz_rechnung_euro.setBounds(new Rectangle(225,130,30,21));

       lbl_finanz_rechnung_pay.setBounds(new Rectangle(10,160,130, 21));
       lbl_finanz_rechnung_pay_view.setBounds(new Rectangle(150,160,100,21));

       lbl_finanz_rechnung_ampel.setBounds(new Rectangle(80, 220, 100, 100));


       pnl_finanz_detail.add(lbl_finanz_rechnung_date_view, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_pay, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_date_view, null);
       pnl_finanz_detail.add(lbl_finanz_rechnungsNr, null);
       pnl_finanz_detail.add(lbl_finanz_rechnungNr_view, null);
       pnl_finanz_detail.add(lbl_finanz_rechnungs_date, null);

       pnl_finanz_detail.add(lbl_finanz_rechnung_betrag, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_betrag_euro, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_betrag_view, null);

       pnl_finanz_detail.add(lbl_finanz_rechnung_auftragNummer, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_auftragsNr_view, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_openPay_view, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_openPay, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_euro, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_pay_view, null);
       pnl_finanz_detail.add(lbl_finanz_rechnung_ampel, null);

       scrPn_finanz_list.setBorder(new EtchedBorder());
       scrPn_finanz_list.setBounds(new Rectangle(10,40,250,400));
       scrPn_finanz_list.getViewport().add(viewList_finanz_rechnung);

       btn_finanz_okay.setBounds(new Rectangle(270,450, 100, 21));
       btn_finanz_cnl.setBounds(new Rectangle(380, 450, 100, 21));

       pnl_finanz.add(lbl_finanz_rechnung, null);
       pnl_finanz.add(lbl_finanz_rechnung_details, null);
       pnl_finanz.add(scrPn_finanz_list, null);
       pnl_finanz.add(pnl_finanz_detail, null);
       pnl_finanz.add(btn_finanz_cnl, null);
       pnl_finanz.add(btn_finanz_okay, null);

       this.getContentPane().add(pnl_finanz, BorderLayout.CENTER);
       this.validate();
       this.repaint();
    }

    private void persistZahlungseingaengefromQueue() throws NotBoundException, InterruptedException, IOException {
        dispatch.getZahlungseingaengeFromQueue();
    }

    private String[] fillRechnungsList(Collection<Rechnung> allRechnung) {
        if(viewList_finanz_rechnung != null)viewList_finanz_rechnung.removeAll();
        String[] tmp = new String[allRechnung.size()];
        int i = 0;
        for (Rechnung elem: allRechnung){
            tmp[i] = ""+elem.getRechnungsnr();
            i++;
        }
        return tmp;
    }

    private void fillCombo_Auftrag(Map<Integer, Auftrag> map, JComboBox comboTransAuftrag) {
        if(comboTransAuftrag.getItemCount() != 0) comboTransAuftrag.removeAllItems();
        comboTransAuftrag.addItem("");
        for(Auftrag elem: map.values()){
            if (elem.getIstAbgeschlossen() == 0){
                comboTransAuftrag.addItem(elem.getAuftragsnr() + "");
            }
        }
    }

    //////////////////

    public static void main(String[] args)  {
        try{
            new GUI_Main();
        }catch (RemoteException e){
            e.printStackTrace();
        } catch (NotBoundException bE){
            bE.printStackTrace();
        }

    }

    ////////////////////
    //  Komponenten  //
    //////////////////

    private HashSet<Bauteil> auftragsVolumen;

    private int komponenten_ID;

    private final int ID_ADD_Angebot = 0;
    private final int ID_EDIT_Angebot = 1;
    private final int ID_DEL_Angebot= 2;
    private final int ID_VIEW_Angebot = 3;
    private final int ID_Ferttigung = 4;
    private final int ID_bauteil = 5;
    private final int ID_ADD_Auftrag = 6;
    private final int ID_TRANSPORT = 7;
    private final int ID_FINANZ = 8;

    private JLabel lbl_name = new JLabel("Kundenname: ");
    private JLabel lbl_produkt = new JLabel("Neues Bauteil");
    private JLabel lbl_warenkorb = new JLabel("Warenkorb: ");
    private JLabel lbl_preis_gesamt = new JLabel("Preis: ");
    private JLabel lbl_preis_einzel = new JLabel("Preis: ");
    private JLabel lbl_arikelnummer = new JLabel("Artikelnummer: ");

    private JLabel lbl_bauteil_view_preis = new JLabel();
    private JLabel lbl_bauteil_view_gewicht = new JLabel();
    private JLabel lbl_bauteil_view_name = new JLabel();
    private JLabel lbl_bauteil_view_id = new JLabel();
    private JLabel lbl_auftrag_view_gesamt_preis = new JLabel();

    private JLabel lbl_euro_view = new JLabel("\u20ac");
    private JLabel lbl_euro_view_angebot = new JLabel("\u20ac");
    private JLabel lbl_kg_view = new JLabel("Kg");

    private JLabel lbl_bauteil_combo = new JLabel("Wähle ein Bauteil: ");
    private JLabel lbl_bauteil_name = new JLabel("Name: ");
    private JLabel lbl_bauteil_gewicht = new JLabel("Gewicht: ");

    private JComboBox combo_kundenname = new JComboBox();
    private JTextField txtfld_preis = new JTextField();

    private JButton btn_addProdukt = new JButton("Add");
    private JTextArea txtarea_warenkorb = new JTextArea();

    private JButton btn_save_auftrag = new JButton("Save");
    private JButton btn_cancel_auftrag = new JButton("Abbrechen");
    private JButton btn_okay_bauteil = new JButton("Save");
    private JButton btn_cancel_bauteil = new JButton("Abbrechen");

    private JButton btn_auftrag_save = new JButton("Auftrag erstellen");
    private JButton btn_auftrag_cancel = new JButton("Abbrechen");

    private JLabel lbl_auftrag_kunde = new JLabel("Kunde: ");
    private JLabel lbl_auftrag_kundenname = new JLabel("Kundenname: ");

    private JLabel lbl_auftrag_view_kundenname = new JLabel();
    private JLabel lbl_auftrag_kunde_nr = new JLabel("KundenNr: ");
    private JLabel lbl_auftrag_view_kunde_nr = new JLabel();

    private JLabel lbl_auftrag_gesamtPreis = new JLabel("Gesamtpreis: ");
    private JLabel lbl_auftrag_viewEuro = new JLabel("\u20ac");

    private JLabel lbl_auftrag_details = new JLabel("Details");

    private JScrollPane scrollPane_auftrag_area = new JScrollPane();

    private JLabel lbl_auftrag_angebot = new JLabel("Angebot: ");

    private JComboBox combo_auftrag_kundenname = new JComboBox();
    private JComboBox comboBox_auftrag_Angebot = new JComboBox();
    private JTextArea txtArea_warenkorb_auftrag = new JTextArea();

    /////////////////////////////////////////
    // Transport & Finanzen
    /////////

    private JLabel lbl_trans_auftrag = new JLabel("Auftrag");
    private JLabel lbl_trans_preis = new JLabel("Gesamtpreis");
    private JLabel lbl_trans_preis_view = new JLabel();
    private JLabel lbl_trans_euro_view = new JLabel("\u20ac");
    private JLabel lbl_trans_details = new JLabel("Details");

    private JTextArea area_trans_details = new JTextArea();
    private JScrollPane scrollPane_trans_details = new JScrollPane();

    private JComboBox combo_trans_auftrag = new JComboBox();

    private JButton btn_trans_okay = new JButton("Beauftragen");
    private JButton btn_trans_cnl = new JButton("Abbruch");


    private JScrollPane scrPn_finanz_list = new JScrollPane();
    private JList viewList_finanz_rechnung;

    private JLabel lbl_finanz_rechnung = new JLabel("Rechnung");
    private JLabel lbl_finanz_rechnung_details = new JLabel("Details");

    private JLabel lbl_finanz_rechnungsNr = new JLabel("Rechnungsnummer: ");
    private JLabel lbl_finanz_rechnungNr_view = new JLabel();
    private JLabel lbl_finanz_rechnungs_date = new JLabel("Rechnungsdatum: ");
    private JLabel lbl_finanz_rechnung_date_view = new JLabel();
    private JLabel lbl_finanz_rechnung_pay = new JLabel("Bezahlt: ");
    private JLabel lbl_finanz_rechnung_pay_view = new JLabel();
    private JLabel lbl_finanz_rechnung_auftragNummer = new JLabel("Auftragnummer: ");
    private JLabel lbl_finanz_rechnung_auftragsNr_view = new JLabel();
    private JLabel lbl_finanz_rechnung_openPay = new JLabel("Offner Betrag: ");
    private JLabel lbl_finanz_rechnung_openPay_view = new JLabel();
    private JLabel lbl_finanz_rechnung_euro = new JLabel("\u20ac");
    private JLabel lbl_finanz_rechnung_betrag = new JLabel("Betrag: ");
    private JLabel lbl_finanz_rechnung_betrag_view = new JLabel();
    private JLabel lbl_finanz_rechnung_betrag_euro = new JLabel("\u20ac");
    private JLabel lbl_finanz_rechnung_ampel = new JLabel();

    private JButton btn_finanz_okay = new JButton("Ok");
    private JButton btn_finanz_cnl = new JButton("Cancel");


    //////////////////////////////////////////

    private JPanel pnl_auftrag = new JPanel();
    private JPanel pnl_bauteil = new JPanel();
    private JPanel pnl_angebot = new JPanel();
    private JPanel pnl_trans = new JPanel();
    private JPanel pnl_finanz = new JPanel();
    private JPanel pnl_finanz_detail = new JPanel();

    //////////////////
    //  Menu
    //////////////


    private JMenu menu_start = new JMenu("Start");
    private JMenu menu_angebot = new JMenu("Angebot");
    private JMenu menu_auftrag = new JMenu("Auftrag");
    private JMenu menu_fertigung = new JMenu("Fertigung");
    private JMenu menu_transport = new JMenu("Transport");
    private JMenu menu_finanz = new JMenu("Finanzen");

    private JMenuItem item_angebot = new JMenuItem("Neu");
    private JMenuItem item_edit = new JMenuItem("Editiere");
    private JMenuItem item_del = new JMenuItem("Löschen");
    private JMenuItem item_view = new JMenuItem("Anzeigen");
    private JMenuItem item_auftrag = new JMenuItem("Neu");

    private JMenuItem item_trans_new = new JMenuItem("Neubeauftragen");
    private JMenuItem item_trans_view = new JMenuItem("Anzeigen");
    private JMenuItem item_trans_storno = new JMenuItem("Storno");

    private JMenuItem item_finanz_check = new JMenuItem("Prüfe Zahlungseingang");

    private JMenuItem item_exit= new JMenuItem("Close");

    private JMenuBar menuBar = new JMenuBar();

    private JComboBox combo_baustein = new JComboBox();

    private  Map<Integer, Set<Angebot>> angebotsMap = new HashMap<Integer, Set<Angebot>>();

    private double gesamtPreis_Angebot;
}
